package com.hedl.practice.diyJava.encryptionandsecurity.signature_algorithm.test;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.*;

public class Main {
    public static void main(String[] args) throws GeneralSecurityException {
        //生成RSA公钥/私钥
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");       //KeyPairGenerator类用于生成公钥和私钥对
        kpGen.initialize(1024);     //密钥大小。 这是一个特定于算法的度量，例如模数长度，以位数指定。

        KeyPair kp = kpGen.generateKeyPair();       //生成密钥对
        PrivateKey sk = kp.getPrivate();        //获取私钥
        PublicKey pk = kp.getPublic();      //获取公钥

        //待签名的消息
        byte[] message = "Hello,I am Bob!".getBytes(StandardCharsets.UTF_8);

        //用私钥签名
        Signature s = Signature.getInstance("SHA1withRSA");     //提供数字签名算法的功能
        s.initSign(sk);     //初始化此对象以进行签名。
        s.update(message);      //更新要由字节签名或验证的数据
        byte[] signed = s.sign();   //返回更新的所有数据的签名字节。
        System.out.println(String.format("signature: %x",new BigInteger(1,signed)));

        //用公钥验证
        Signature v = Signature.getInstance("SHA1withRSA");
        v.initVerify(pk);       //初始化此对象以进行验证。
        v.update(message);      //
        boolean valid = v.verify(signed);       //验证传入的签名。
        System.out.println("valid?"+valid);


    }
}
